package base_grammar

import (
	"fmt"
	"unsafe"
)

/*
byte 和 uint8 没有区别，rune 和 uint32 没有区别，那为什么还要多出一个 byte 和 rune 类型呢？
因为uint8 和 uint32 ，直观上让人以为这是一个数值，但是实际上，它也可以表示一个字符，
所以为了消除这种直观错觉，就诞生了 byte 和 rune 这两个别名类型。

*/

func Func_byte() {
	/**
	byte，占用1个节字，就 8 个比特位（2^8 = 256，因此 byte 的表示范围 0->255），
	所以它和 uint8 类型本质上没有区别，它表示的是 ACSII 表中的一个字符。
	*/

	// A
	var a byte = 65
	fmt.Printf("a: %c\n", a)
	// 8进制写法  \固定前缀
	a = '\101'
	fmt.Printf("a: %c\n", a)
	// 十六进制写法  \x固定前缀
	a = '\x41'
	fmt.Printf("a: %c\n", a)

	var b uint8 = 66
	fmt.Printf("b: %c\n", b)

	fmt.Println("a:", string(a), " b:", string(b))

	a = 'A'
	b = 'B'
	fmt.Printf("a: %c\n", a)
	fmt.Printf("b: %c\n", b)
}

func Func_rune() {
	/*
		rune 符号记号
		rune，占用4个字节，共32位比特位，所以它和 int32 本质上也没有区别。
		它表示的是一个 Unicode字符（Unicode是一个可以表示世界范围内的绝大部分字符的编码规范）。
	*/
	var a byte = 'A' // 1 字节
	var b rune = 'B' //4 字节
	b = '中'
	fmt.Printf("a 占用%d个字节数 \nb占用%d个字节数 \n", unsafe.Sizeof(a), unsafe.Sizeof(b))
}

func Func_str1() {
	var mystr1 string = "hello"
	var mystr2 [5]byte = [5]byte{104, 101, 108, 108, 111}
	fmt.Printf("mystr1: %s\n", mystr1)
	fmt.Printf("mystr2: %s\n", mystr2)
}

func Func_str2() {
	var country string = "hello,中国"
	// 5 + 1 + 3 + 3
	fmt.Println("string字节数", len(country))

	var mystr string = "\r\n"
	// 换行
	fmt.Printf("mystr: %v\n", mystr)
	mystr = "\\r\\n"
	//转义输出
	fmt.Printf("mystr: %v\n", mystr)
	mystr = `\r\n`
	// ``直接输出
	fmt.Printf("mystr: %v\n", mystr)
	fmt.Printf("\\r\\n的解释型字符串是 %q\n", mystr)

	mystr = `嘻嘻哈哈哈
	dasdsad
	go换行不用拼接  hahahha
	666
	`
	fmt.Printf("mystr: %v\n", mystr)

}
